home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 16 / CU Amiga Magazine's Super CD-ROM 16 (1997-10-16)(EMAP Images)(GB)[!][issue 1997-11].iso / CUCD / Graphics / Ghostscript / source / gxclist.h < prev    next >
C/C++ Source or Header  |  1997-05-21  |  11KB  |  273 lines

  1. /* Copyright (C) 1991, 1995, 1996, 1997 Aladdin Enterprises.  All rights reserved.
  2.   
  3.   This file is part of Aladdin Ghostscript.
  4.   
  5.   Aladdin Ghostscript is distributed with NO WARRANTY OF ANY KIND.  No author
  6.   or distributor accepts any responsibility for the consequences of using it,
  7.   or for whether it serves any particular purpose or works at all, unless he
  8.   or she says so in writing.  Refer to the Aladdin Ghostscript Free Public
  9.   License (the "License") for full details.
  10.   
  11.   Every copy of Aladdin Ghostscript must include a copy of the License,
  12.   normally in a plain ASCII text file named PUBLIC.  The License grants you
  13.   the right to copy, modify and redistribute Aladdin Ghostscript, but only
  14.   under certain conditions described in the License.  Among other things, the
  15.   License requires that the copyright notice and this notice be preserved on
  16.   all copies.
  17. */
  18.  
  19. /* gxclist.h */
  20. /* Command list definitions for Ghostscript. */
  21. /* Requires gxdevice.h and gxdevmem.h */
  22.  
  23. #ifndef gxclist_INCLUDED
  24. #  define gxclist_INCLUDED
  25.  
  26. #include "gscspace.h"
  27. #include "gxbcache.h"
  28. #include "gxclio.h"
  29. #include "gxistate.h"
  30.  
  31. /*
  32.  * A command list is essentially a compressed list of driver calls.
  33.  * Command lists are used to record an image that must be rendered in bands
  34.  * for high-resolution and/or limited-memory printers.
  35.  *
  36.  * Command lists work in two phases.  The first phase records driver calls,
  37.  * sorting them according to the band(s) they affect.  The second phase
  38.  * reads back the commands band-by-band to create the bitmap images.
  39.  * When opened, a command list is in the recording state; it switches
  40.  * automatically from recording to reading when its get_bits procedure
  41.  * is called.  Currently, there is a hack to reopen the device after
  42.  * each page is processed, in order to switch back to recording.
  43.  */
  44.  
  45. /*
  46.  * The command list contains both commands for particular bands (the vast
  47.  * majority) and commands that apply to a range of bands.  In order to
  48.  * synchronize the two, we maintain the following invariant for buffered
  49.  * commands:
  50.  *
  51.  *    If there are any band-range commands in the buffer, they are the
  52.  *    first commands in the buffer, before any specific-band commands.
  53.  *
  54.  * To maintain this invariant, whenever we are about to put an band-range
  55.  * command in the buffer, we check to see if the buffer already has any
  56.  * band-range commands in it, and if so, whether they are the last commands
  57.  * in the buffer and are for the same range; if the answer to any of these
  58.  * questions is negative, we flush the buffer.
  59.  */
  60.  
  61. /* ---------------- Public structures ---------------- */
  62.  
  63. /*
  64.  * Define the parameters controlling banding.
  65.  */
  66. typedef struct gx_band_params_s {
  67.   int BandWidth;            /* (optional) band width in pixels */
  68.   int BandHeight;            /* (optional) */
  69.   long BandBufferSpace;            /* (optional) */
  70. } gx_band_params;
  71. #define band_params_initial_values 0, 0, 0
  72.  
  73. /*
  74.  * Define the information for a saved page.
  75.  */
  76. typedef struct gx_band_page_info_s {
  77.   char cfname[60];        /* command file name */
  78.   clist_file_ptr cfile;        /* command file, normally 0 */
  79.   char bfname[60];        /* block file name */
  80.   clist_file_ptr bfile;        /* block file, normally 0 */
  81.   uint tile_cache_size;        /* size of tile cache */
  82.   long bfile_end_pos;        /* ftell at end of bfile */
  83.   gx_band_params band_params;    /* parameters used when writing band list */
  84.                 /* (actual values, no 0s) */
  85. } gx_band_page_info;
  86. /*
  87.  * By convention, the structure member containing the above is called
  88.  * page_info.  Define shorthand accessors for its members.
  89.  */
  90. #define page_cfile page_info.cfile
  91. #define page_cfname page_info.cfname
  92. #define page_bfile page_info.bfile
  93. #define page_bfname page_info.bfname
  94. #define page_tile_cache_size page_info.tile_cache_size
  95. #define page_bfile_end_pos page_info.bfile_end_pos
  96. #define page_band_height page_info.band_params.BandHeight
  97.  
  98. /*
  99.  * Define a saved page object.  This consists of a snapshot of the device
  100.  * structure, information about the page per se, and the num_copies
  101.  * parameter of output_page.
  102.  */
  103. typedef struct gx_saved_page_s {
  104.   gx_device device;
  105.   char dname[8+1];        /* device name for checking */
  106.   gx_band_page_info info;
  107.   int num_copies;
  108. } gx_saved_page;
  109.  
  110. /*
  111.  * Define a saved page placed at a particular (X,Y) offset for rendering.
  112.  */
  113. typedef struct gx_placed_page_s {
  114.   gx_saved_page *page;
  115.   gs_int_point offset;
  116. } gx_placed_page;
  117.  
  118. /* ---------------- Internal structures ---------------- */
  119.  
  120. /*
  121.  * Currently, halftoning occurs during the first phase, producing calls
  122.  * to tile_rectangle.  Both phases keep a cache of recently seen bitmaps
  123.  * (halftone cells and characters), which allows writing only a short cache
  124.  * index in the command list rather than the entire bitmap.
  125.  *
  126.  * We keep only a single cache for all bands, but since the second phase
  127.  * reads the command lists for each band separately, we have to keep track
  128.  * for each cache entry E and band B whether the definition of E has been
  129.  * written into B's list.  We do this with a bit mask in each entry.
  130.  *
  131.  * Eventually, we will replace this entire arrangement with one in which
  132.  * we pass the actual halftone screen (whitening order) to all bands
  133.  * through the command list, and halftoning occurs on the second phase.
  134.  * This not only will shrink the command list, but will allow us to apply
  135.  * other rendering algorithms such as error diffusion in the second phase.
  136.  */
  137. typedef struct {
  138.     ulong offset;        /* writing: offset from cdev->data, */
  139.                 /*   0 means unused */
  140.                 /* reading: offset from cdev->chunk.data */
  141. } tile_hash;
  142. typedef struct {
  143.     gx_cached_bits_common;
  144.     /* To save space, instead of storing rep_width and rep_height, */
  145.     /* we store width / rep_width and height / rep_height. */
  146.     byte x_reps, y_reps;
  147.     ushort rep_shift;
  148.     ushort index;        /* index in table (hash table when writing) */
  149.     ushort num_bands;    /* # of 1-bits in the band mask */
  150.     /* byte band_mask[]; */
  151. #define ts_mask(pts) (byte *)((pts) + 1)
  152.     /* byte bits[]; */
  153. #define ts_bits(cldev,pts) (ts_mask(pts) + (cldev)->tile_band_mask_size)
  154. } tile_slot;
  155.  
  156. /* Define the prefix on each command run in the writing buffer. */
  157. typedef struct cmd_prefix_s cmd_prefix;
  158. struct cmd_prefix_s {
  159.     cmd_prefix *next;
  160.     uint size;
  161. };
  162.  
  163. /* Define the pointers for managing a list of command runs in the buffer. */
  164. /* There is one of these for each band, plus one for band-range commands. */
  165. typedef struct cmd_list_s {
  166.     cmd_prefix *head, *tail;    /* list of commands for band */
  167. } cmd_list;
  168.  
  169. /*
  170.  * In order to keep the per-band state down to a reasonable size,
  171.  * we store only a single set of the imager state parameters;
  172.  * for each parameter, each band has a flag that says whether that band
  173.  * 'knows' the current value of the parameters.
  174.  */
  175. extern const gs_imager_state clist_imager_state_initial;
  176.  
  177. /*
  178.  * Define the main structure for holding command list state.
  179.  * Unless otherwise noted, all elements are used in both the writing (first)
  180.  * and reading (second) phase.
  181.  */
  182. typedef struct gx_clist_state_s gx_clist_state;
  183. #define gx_device_clist_common\
  184.     gx_device_forward_common;    /* (see gxdevice.h) */\
  185.         /* Following must be set before writing or reading. */\
  186.     /* gx_device *target; */    /* device for which commands */\
  187.                     /* are being buffered */\
  188.     dev_proc_make_buffer_device((*make_buffer_device));\
  189.     byte *data;            /* buffer area */\
  190.     uint data_size;            /* size of buffer */\
  191.     gx_band_params band_params;    /* band buffering parameters */\
  192.         /* Following are used for both writing and reading. */\
  193.     gx_bits_cache_chunk chunk;    /* the only chunk of bits */\
  194.     gx_bits_cache bits;\
  195.     uint tile_hash_mask;        /* size of tile hash table -1 */\
  196.     uint tile_band_mask_size;    /* size of band mask preceding */\
  197.                     /* each tile in the cache */\
  198.     tile_hash *tile_table;        /* table for tile cache: */\
  199.                     /* see tile_hash above */\
  200.                     /* (a hash table when writing) */\
  201.     int ymin, ymax;            /* current band, <0 when writing */\
  202.         /* Following are set when writing, read when reading. */\
  203.     gx_band_page_info page_info;    /* page information */\
  204.     int nbands            /* # of bands */
  205.  
  206. #define clist_band_height(cldev) ((cldev)->page_info.band_height)
  207. #define clist_cfname(cldev) ((cldev)->page_info.cfname)
  208. #define clist_cfile(cldev) ((cldev)->page_info.cfile)
  209. #define clist_bfname(cldev) ((cldev)->page_info.bfname)
  210. #define clist_bfile(cldev) ((cldev)->page_info.bfile)
  211.  
  212. /* Define the length of the longest dash pattern we are willing to store. */
  213. /* (Strokes with longer patterns are converted to fills.) */
  214. #define cmd_max_dash 11
  215.  
  216. /* Define the state of a band list when writing. */
  217. typedef struct gx_device_clist_writer_s {
  218.     gx_device_clist_common;        /* (must be first) */
  219.     int error_code;            /* error returned by cmd_put_op */
  220.     gx_clist_state *states;        /* current state of each band */
  221.     byte *cbuf;            /* start of command buffer */
  222.     byte *cnext;            /* next slot in command buffer */
  223.     byte *cend;            /* end of command buffer */
  224.     cmd_list *ccl;            /* &clist_state.list of last command */
  225.     cmd_list band_range_list;    /* list of band-range commands */
  226.     int band_range_min, band_range_max;    /* range for list */
  227.     uint tile_max_size;        /* max size of a single tile (bytes) */
  228.     uint tile_max_count;        /* max # of hash table entries */
  229.     gx_strip_bitmap tile_params;    /* current tile parameters */
  230.     int tile_depth;            /* current tile depth */
  231.     int tile_known_min, tile_known_max;
  232.                     /* range of bands that knows the */
  233.                     /* current tile parameters */
  234.     gs_imager_state imager_state;    /* current values of imager params */
  235.     float dash_pattern[cmd_max_dash]; /* current dash pattern */
  236.     const gx_clip_path *clip_path;    /* current clip path */
  237.     gs_id clip_path_id;        /* id of current clip path */
  238.     byte color_space;        /* current color space identifier */
  239.                     /* (only used for images) */
  240.     gs_indexed_params indexed_params;  /* current indexed space parameters */
  241.                     /* (ditto) */
  242.     gs_id transfer_ids[4];        /* ids of transfer maps */
  243.     gs_id black_generation_id;    /* id of black generation map */
  244.     gs_id undercolor_removal_id;    /* id of u.c.r. map */
  245.     gs_id device_halftone_id;    /* id of device halftone */
  246.     bool in_image;            /* true if we are inside an image */
  247.                     /* that we are passing through */
  248. } gx_device_clist_writer;
  249.  
  250. /* Define the state of a band list when reading. */
  251. /* For normal rasterizing, pages and num_pages are both 0. */
  252. typedef struct gx_device_clist_reader_s {
  253.     gx_device_clist_common;        /* (must be first) */
  254.     const gx_placed_page *pages;
  255.     int num_pages;
  256. } gx_device_clist_reader;
  257.  
  258. typedef union gx_device_clist_s {
  259.     struct _clc {
  260.       gx_device_clist_common;
  261.     } common;
  262.     gx_device_clist_reader reader;
  263.     gx_device_clist_writer writer;
  264. } gx_device_clist;
  265.  
  266. /* The device template itself is never used, only the procedures. */
  267. extern gx_device_procs gs_clist_device_procs;
  268.  
  269. /* Reset (or prepare to append to) the command list after printing a page. */
  270. int clist_finish_page(P2(gx_device *dev, bool flush));
  271.  
  272. #endif                    /* gxclist_INCLUDED */
  273.